revealer: Implement snapshot()
authorBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 18:06:07 +0000 (19:06 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 18:26:40 +0000 (19:26 +0100)
The revealer needs to clip the child during animations, whcih draw() did
automatically, but snapshot() does not.

gtk/gtkrevealer.c

index e42be2e37bda4ebe17e7c15233b099a2585f2bce..351c73540f9f4260c126adac5cfcebff653cad9f 100644 (file)
  */
 
 #include "config.h"
+
 #include "gtkrevealer.h"
-#include <gdk/gdk.h>
-#include "gtktypebuiltins.h"
+
+#include "gtkintl.h"
 #include "gtkprivate.h"
-#include "gtksettingsprivate.h"
 #include "gtkprogresstrackerprivate.h"
-#include "gtkintl.h"
+#include "gtksettingsprivate.h"
+#include "gtksnapshot.h"
+#include "gtktypebuiltins.h"
 
 #include "fallback-c89.c"
 
@@ -107,6 +109,8 @@ static void gtk_revealer_measure (GtkWidget      *widget,
                                   int            *natural,
                                   int            *minimum_baseline,
                                   int            *natural_baseline);
+static void     gtk_revealer_snapshot                            (GtkWidget     *widget,
+                                                                  GtkSnapshot   *snapshot);
 
 G_DEFINE_TYPE_WITH_PRIVATE (GtkRevealer, gtk_revealer, GTK_TYPE_BIN)
 
@@ -219,6 +223,7 @@ gtk_revealer_class_init (GtkRevealerClass *klass)
   widget_class->map = gtk_revealer_real_map;
   widget_class->unmap = gtk_revealer_real_unmap;
   widget_class->measure = gtk_revealer_measure;
+  widget_class->snapshot = gtk_revealer_snapshot;
 
   container_class->add = gtk_revealer_real_add;
 
@@ -818,6 +823,37 @@ gtk_revealer_measure (GtkWidget      *widget,
     set_height_with_paddings (GTK_REVEALER (widget), min_size, nat_size, minimum, natural);
 }
 
+static void
+gtk_revealer_snapshot (GtkWidget   *widget,
+                       GtkSnapshot *snapshot)
+{
+  GtkRevealer *revealer = GTK_REVEALER (widget);
+  GtkRevealerTransitionType transition;
+  GtkWidget *child;
+
+  child = gtk_bin_get_child (GTK_BIN (revealer));
+  if (child == NULL || !gtk_widget_get_mapped (child))
+    return;
+
+  transition = effective_transition (revealer);
+  if (transition == GTK_REVEALER_TRANSITION_TYPE_NONE)
+    {
+      gtk_container_snapshot_child (GTK_CONTAINER (revealer), child, snapshot);
+    }
+  else
+    {
+      gtk_snapshot_push_clip (snapshot,
+                              &GRAPHENE_RECT_INIT(
+                                  0, 0,
+                                  gtk_widget_get_allocated_width (widget),
+                                  gtk_widget_get_allocated_height (widget)
+                              ),
+                              "RevealerClip");
+      gtk_container_snapshot_child (GTK_CONTAINER (revealer), child, snapshot);
+      gtk_snapshot_pop_and_append (snapshot);
+    }
+}
+
 /**
  * gtk_revealer_get_transition_duration:
  * @revealer: a #GtkRevealer